home *** CD-ROM | disk | FTP | other *** search
- PAGE 61,132
-
- TITLE EgaBlank 1.0 - Not Copyrighted (nc) 1986 - GDC Software
-
- COMMENT *
-
- EGABLANK.COM - This program attaches itself to MS-DOS or PC-DOS for
- automatic blanking of an EGA display screen after a given
- number of minutes.
-
- ASSEMBLY - MASM EGABLANK;
- LINK EGABLANK;
- EXE2BIN EGABLANK.EXE EGABLANK.COM
-
- AUTHOR - Bruce Dubbs
- GDC Software
- 122 Valencia Dr.
- Universal City, TX 78148
-
- THIS PROGRAM IS NOT COPYRIGHTED 1986. IT IS RELEASED INTO
- THE PUBLIC DOMAIN FOR WHATEVER USE YOU WANT. IF YOU WANT
- TO DISTRIBUTE THIS PROGRAM OR USE IT WITH ANY OTHER WAY,
- AN ACKNOWLEDGEMENT WOULD BE NICE. *
-
-
- SUBTTL Basic Definitions and Setup
- PAGE
-
- TRUE EQU 0FFFFh
- FALSE EQU NOT TRUE
-
- ON EQU TRUE
- OFF EQU FALSE
-
- CR EQU 0Dh
- LF EQU 0Ah
- TAB EQU 09h
- BEL EQU 07h
-
- INT_PER_MIN EQU 1092 ; PCs have 1092 timer interrupts
- ; per minute
-
- .SALL ; Supress MACRO listings
-
- SUBTITLE MACRO STRING ; Change the subtitle but
- ; don't display SUBTTL command
- SUBTTL STRING
- .LIST
- PAGE
- ENDM
-
- PRINT MACRO STRING ; Print a string
- MOV DX,OFFSET STRING
- MOV AH,9
- INT 21h
- ENDM
-
-
- BIOS SEGMENT AT 40h
- ORG 87h
- EGA_STATUS LABEL BYTE
- BIOS ENDS
-
-
- CSEG SEGMENT
-
- ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING
-
- ORG 80h
- INPUT_COUNT LABEL BYTE
- ORG 81h
- INPUT_BUFFER LABEL BYTE
-
- ORG 100h
-
- START: JMP TRANSIENT
-
- ID DB 'EgaBlank 1.0'
- DELAY DW 10*INT_PER_MIN ; Default delay is 10 minutes
- COUNTER DW 0
- SCREEN DB 0FFh
- ASCII_DELAY DW '10'
- .XLIST
- SUBTITLE <Interrupt 21h routine>
-
- REAL21 LABEL DWORD
- REAL21_OFS DW ?
- REAL21_SEG DW ?
-
- INT21: PUSHF ; Save flags
- CMP AH,0BDH ; Is this 'our' function?
- JE OUR_FUNCTION
- OLD: POPF ; Restore flags we called with
- JMP CS:REAL21 ; Otherwise don't mess with the
- ; interrupt
-
- ; Check if caller is looking for this program
-
- OUR_FUNCTION: PUSH ES ; Save registers
- PUSH CX ;
- PUSH SI ;
- PUSH DI ;
-
- PUSH CS ; Set destination to us
- POP ES ;
- MOV DI,OFFSET ID ; Point to our ID
- MOV CX,12 ;
- CLD
- REPE CMPSB ; See if ID is us
-
- POP DI ; Restore registers
- POP SI ;
- JCXZ ID_OK ; If zero, ID matches
- POP CX ; Reset registers
- POP ES ;
- JMP OLD ; And continue to DOS
-
- ID_OK: POP CX ; Reset CX
- ADD SP,2 ; ES stays the same
- NOT BX ; Invert BX to say we're here
- POPF
- IRET
-
- .XLIST
- SUBTITLE <Interrupt 1Ch (timer) routine>
-
- REAL_1C LABEL DWORD
- REAL_1C_OFS DW ?
- REAL_1C_SEG DW ?
-
- TIMER: PUSHF ; Save flags
- PUSH AX
- PUSH DS
- MOV AX,CS
- MOV DS,AX
- CMP SCREEN,OFF ; Is screen already off?
- JE TIMER_1
- CMP DELAY,0 ; Is EgaBlank disabled?
- JE TIMER_1
- INC COUNTER ; Bump the counter
- MOV AX,COUNTER
- CMP AX,DELAY ; Check the limit
- JC TIMER_1
- MOV SCREEN,OFF
- CALL SCREEN_OFF
- TIMER_1: POP DS
- POP AX
- POPF ; Restore flags we called with
- JMP CS:REAL_1C
-
- .XLIST
- SUBTITLE <Interrupt 9 (keyboard) routine>
-
- REAL9 LABEL DWORD
- REAL9_OFS DW ?
- REAL9_SEG DW ?
-
- KEYBD: PUSHF ; Save flags
- PUSH AX
- PUSH DS
- MOV AX,CS
- MOV DS,AX
- MOV COUNTER,0 ; Reset the counter
- CMP SCREEN,ON ; If screen on, continue
- JE KEYBD_1
-
- MOV SCREEN,ON
- CALL SCREEN_ON
- POP DS ; Restore registers
- POP AX
- POPF
-
- PUSH AX ; Throw away keystroke
- IN AL,60h
- IN AL,61h
- MOV AH,AL
- OR AL,80h
- OUT 61H,AL
- XCHG AH,AL
- OUT 61H,AL
- CLI
- MOV AL,20h
- OUT 20h,AL
- POP AX
- IRET
-
- KEYBD_1: POP DS
- POP AX
- POPF ; Restore flags we called with
- JMP CS:REAL9
-
- .XLIST
- SUBTITLE <Interrupt 10h (video io) routine>
-
- REAL10 LABEL DWORD
- REAL10_OFS DW ?
- REAL10_SEG DW ?
-
- VIDEO: PUSHF ; Save flags
- PUSH AX
- PUSH DS
- MOV AX,CS
- MOV DS,AX
- MOV COUNTER,0
- CMP SCREEN,ON
- JE VIDEO_1
- MOV SCREEN,ON
- CALL SCREEN_ON
- VIDEO_1: POP DS
- POP AX
- POPF ; Restore flags we called with
- JMP CS:REAL10
-
- .XLIST
- SUBTITLE <Screen on/off procedure>
-
- SCREEN_ON: MOV AL,20h
- JMP Short SCREEN_IO
-
- SCREEN_OFF: MOV AL,0
-
- SCREEN_IO: PUSH DX
- PUSH AX
- MOV DX,03BAh
- IN AL,DX ; Reset mono flip-flop
- MOV DL,0DAh
- IN AL,DX ; Reset color flip-flop
- MOV DL,0C0h ; Attribute port
- POP AX ; Get on/off pattern
- OUT DX,AL ; Turn screen on or off
- POP DX
- RET
-
- .XLIST
- SUBTITLE <Installation and info procedure>
-
- ERROR DB 0 ; False
- RESIDENT DB 0FFh ; True
-
- TRANSIENT PROC NEAR
-
- MOV AX,CS ; Set segment registers
- MOV DS,AX
- MOV ES,AX
-
- ; Check if EgaBlank is already installed by calling a special (our own)
- ; function of INT 21h.
-
- MOV AH,0BDh ; Our interrupt
- MOV SI,OFFSET ID ; Point to name
- XOR BX,BX ; Insure BX is zero
- INT 21h ; See if already resident
- PUSH ES ; Save pointer
- INC BX ; If so, BX will now be zero
- JZ TRANSIENT_2
- ; Set INT 21h
- CALL CHECK_HW
- MOV AX,3521h ; GET OLD INT 21 ADDR
- INT 21h
- MOV REAL21_OFS,BX ; SAVE IT
- MOV REAL21_SEG,ES
- MOV DX,OFFSET INT21 ; POINT TO OFFSET
- MOV AX,2521h ; UPDATE THE INTERRUPT
- INT 21h
- ; Set INT 1Ch
- MOV AX,351Ch ; GET OLD INT 1Ch ADDR
- INT 21h
- MOV REAL_1C_OFS,BX ; SAVE IT
- MOV REAL_1C_SEG,ES
- MOV DX,OFFSET TIMER ; POINT TO OFFSET
- MOV AX,251Ch ; UPDATE THE INTERRUPT
- INT 21h
- ; Set INT 9
- MOV AX,3509h ; GET OLD INT 9 ADDR
- INT 21h
- MOV REAL9_OFS,BX ; SAVE IT
- MOV REAL9_SEG,ES
- MOV DX,OFFSET KEYBD ; POINT TO OFFSET
- MOV AX,2509h ; UPDATE THE INTERRUPT
- INT 21h
- ; Set INT 10h
- MOV AX,3510h ; GET OLD INT 10 ADDR
- INT 21h
- MOV REAL10_OFS,BX ; SAVE IT
- MOV REAL10_SEG,ES
- MOV DX,OFFSET VIDEO ; POINT TO OFFSET
- MOV AX,2510h ; UPDATE THE INTERRUPT
- INT 21h
-
- MOV RESIDENT,FALSE
- PAGE
- TRANSIENT_2: POP ES ; Get resident segment
-
- MOV CH,0
- MOV CL,INPUT_COUNT ; See if a new time was passed
- CMP CL,0
- JE PRINT_1
- MOV SI,OFFSET INPUT_BUFFER
- CLD
-
- PARSE_1: LODSB ; Get a byte
- CMP AL,' ' ; Skip Tabs and blanks
- JE PARSE_1
- CMP AL,TAB
- JE PARSE_1
- CMP AL,CR
- JE PRINT_1 ; End of string - no input
-
- CMP AL,'0' ; Check for a number
- JL SET_ERROR
- CMP AL,'9'
- JA SET_ERROR
- MOV AH,AL ; Save in AH
-
- LODSB ; Get next character
- CMP AL,' ' ; Check for end of input
- JLE PARSE_3
- CMP AL,'0' ; Check for a number
- JL SET_ERROR
- CMP AL,'9'
- JG SET_ERROR
- JMP SHORT PARSE_4
-
- PARSE_3: MOV AL,0 ; Set hi digit to nul
- XCHG AL,AH ; Get hi & lo digits in order
-
- PARSE_4: MOV BX,AX ; Store ASCII minutes in BX
- AND AX,0F0Fh ; Make BCD
- AAD ; Make Binary
- CMP AX,60
- JG SET_ERROR
- MOV CX,INT_PER_MIN
- MUL CX
- MOV ES:DELAY,AX ; Store counts
- XCHG BH,BL ; Put ASCII in order
- MOV ES:ASCII_DELAY,BX ; Store ASCII minutes
- JMP SHORT PRINT_1
-
- SET_ERROR: MOV ERROR,TRUE
- PAGE
-
- PRINT_1: PRINT LOGO
- CMP RESIDENT,TRUE
- JE PRINT_2
- PRINT INSTALLED
-
- PRINT_2: CMP ES:DELAY,0
- JNE PRINT_3
- PRINT DEACTIVATED
- JMP SHORT PRINT_4
-
- PRINT_3: MOV AX,ES:ASCII_DELAY
- MOV MINUTES,AX
- PRINT EGATIME
- CMP ES:DELAY,INT_PER_MIN
- JE PRINT_3A
- PRINT S
- JMP SHORT PRINT_4
- PRINT_3A: PRINT NO_S
-
- PRINT_4: CMP ERROR,TRUE
- JNE EXIT
- PRINT ERROR_MSG
-
- ; Just terminate if we are already resident
-
- EXIT: CMP RESIDENT,TRUE
- JNE EXIT_1
- MOV AX,4C00H ; OK RETURN
- INT 21H ; TERMINATE
-
- ; Exit but stay resident - set paragraphs to save
-
- PARAS = ((ERROR-START+100h) SHR 4) + 1 ;
-
- EXIT_1: MOV DX,PARAS ; SET LENGTH TO RESERVE
- MOV AX,3100H
- INT 21H ; TERMINATE & STAY RESIDENT
-
- PAGE
-
- LOGO DB CR,LF,TAB,'EgaBlank by GDC Software $'
- INSTALLED DB 'installed.$'
-
- EGATIME DB CR,LF,TAB,'EgaBlank timeout set to '
- MINUTES LABEL WORD
- DB '10 minute$'
- S DB 's.',CR,LF,'$'
- NO_S DB '.',CR,LF,'$'
-
- ERROR_MSG DB CR,LF,TAB,BEL,'Illegal parameter - ignored'
- DB LF
- DB CR,LF,TAB,'Usage: EGABLANK m'
- DB CR,LF,TAB,TAB,'m = The time in minutes (0 to 60) before'
- DB CR,LF,TAB,TAB,'the screen is blanked. Use 0 to turn'
- DB CR,LF,TAB,TAB,'EgaBlank off.',LF,CR,'$'
-
- DEACTIVATED DB CR,LF,TAB,'EgaBlank is deactivated',CR,LF,'$'
-
- TRANSIENT ENDP
-
- .XLIST
- SUBTITLE <Check for EGA board>
-
- CHECK_HW PROC NEAR
-
- MOV AX,SEG BIOS ; Get EGA status byte
- MOV ES,AX
- MOV AL,ES:EGA_STATUS
- CMP AL,0 ; If zero, no EGA present
- JE NO_EGA
- TEST AL,00001000b ; If bit 3 not set, EGA is
- JNZ EGA_NOT_ACTIVE ; present but not active
- RET ; Present & active - do nothing
-
- NO_EGA: PRINT NO_BOARD ; Print message and terminate
- JMP SHORT ERROR_EXIT
-
- EGA_NOT_ACTIVE: PRINT NOT_ACTIVE
-
- ERROR_EXIT: PRINT NOT_INSTALLED
- MOV AX,4CFFh
- INT 21h
-
- NO_BOARD DB CR,LF,BEL,'EGA board not installed.$'
- NOT_ACTIVE DB CR,LF,BEL,'EGA board not active.$'
- NOT_INSTALLED DB CR,LF,'EgaBlank NOT activated.',CR,LF,'$'
-
- CHECK_HW ENDP
-
- CSEG ENDS
-
- END START